package com.zxiw.zxedu.datasync

/**
 * @author zhangxiaoming
 * @date 2023/8/9
 * @description
 *
 * 任务项目，将一系列任务的集合当做一个任务工程来处理，这样每个功能模块都可以有自己的任务项目
 */
class XTaskProject(private val name: String) : IXTaskProject, XTaskLogger {
    /**
     * 为什么用map，利用Key-Value，判断同名的Task是否存在
     */
    private val taskMap = mutableMapOf<String, XTask>()

    /**
     * 为什么用List，因为需要对Task进行排序，可以说是空间换时间
     */
    private val taskList: MutableList<XTask> = mutableListOf()

    override fun addTask(task: XTask): IXTaskProject {
        //任务名称不能重复
        if (!taskMap.contains(task.name)) {
            logger.debug { "add Task $task" }
            taskMap[task.name] = task
        }
        return this
    }

    override fun getTasks(): List<XTask> {
        // 根据优先级排序，值小的先执行
        return taskList.apply {
            clear()
            addAll(ArrayList(taskMap.values))
            sortBy { it.priority }
        }
    }

    override fun release() {
        logger.debug { "release" }
        taskMap.clear()
        taskList.clear()
    }

}

interface IXTaskProject {

    fun addTask(task: XTask): IXTaskProject

    fun getTasks(): List<XTask>

    fun release()

}